from django.conf import settings
from alipay import AliPay
from alipay.utils import AliPayConfig
from datetime import datetime

class Alipay(AliPay):
    def __init__(self, config=None):

        """
        参考文档：https://github.com/fzlee/alipay/blob/master/docs/init.zh-hans.md
        """

        if config is None:
            self.config = settings.ALIPAY
        else:
            self.config = config

        # 应用私钥
        app_private_key_path = open(self.config['app_private_key_path']).read()
        # 支付宝公钥
        alipay_public_key_path = open(self.config['alipay_public_key_path']).read()

        super().__init__(
            appid=self.config['appid'],
            app_notify_url=self.config['notify_url'],
            app_private_key_string=app_private_key_path,
            # 支付宝公钥, 验证支付宝回调消息使用，不是开发者公钥
            alipay_public_key_string=alipay_public_key_path,
            sign_type=self.config['sign_type'], # RSA2或RSA
            debug=self.config['debug'], # 默认False，True时，使用沙箱环境
            verbose=self.config['verbose'], # 默认False，True时，输出调试信息
            config=AliPayConfig(timeout=self.config['timeout'])
        )

    def page_pay(self,out_trade_no,total_amount,subject):
        """
        生成支付链接
        @parmas out_trade_no: 商户订单号
        @parmas total_amount: 订单金额
        @parmas subject: 订单标题
        @return 支付链接
        """
        order_string = self.client_api(
            "alipay.trade.page.pay",
            biz_content={
                'out_trade_no': out_trade_no,# 商户订单号
                'total_amount': float(total_amount),# 付款金额
                'subject': subject,# 商品的标题/交易标题/订单标题/订单关键字等。
                'product_code': 'FAST_INSTANT_TRADE_PAY',# 销售产品码，与支付宝签约的产品码名称。 注：目前仅支持 FAST_INSTANT_TRADE_PAY


            },
            return_url = self.config['return_url'], # 同步回调地址,支付成功后跳转到这个地址
            notify_url = self.config['notify_url'],# 异步回调地址,支付成功后，支付宝会向这个地址发送交易状态的通知
        )

        return f"{self.config['gateway']}?{order_string}"

    def check_sign(self, data):
        """
        验证返回的支付结果中的签证信息
        @params data: 支付平台返回的支付结果，字典格式

        """
        signature = data.pop('sign')
        success = self.verify(data, signature)
        return success

    def query(self, out_trade_no):
        """
         根据订单号查询订单状态
        @params out_trade_no: 订单号
        """
        return self.server_api(
            "alipay.trade.query",
            biz_content={'out_trade_no': out_trade_no},
        )

    def refund(self,out_trade_no,refund_amount):
        """
        退款
        @params out_trade_no: 订单号
        @params refund_amount: 退款金额
        """
        self.server_api(
            'alipay.trade.refund',
            biz_content={
                'out_trade_no': out_trade_no, # 订单号
                'refund_amount': refund_amount, # 退款金额

            }
        )

    def transfer(self,account,amount):
        """
        转账
        @params account: 收款账户
        @params amount: 转账金额

        """
        return self.server_api(
            'alipay.fund.trans.toaccount.transfer',
            biz_content={
                'out_biz_no':datetime.now().strftime('%Y%m%d%H%M%S'),
                'payee_type':'ALIPAY_LOGONID',
                'payee_account':account, # 收款账户
                'amount':amount, # 转账金额
            }
        )

    def query_transfer(self,trans_time):
        """
        查询转账结果
        @params trans_time: 转账时间
        """
        return self.server_api(
            'alipay.fund.trans.detail.query',
            biz_content={
                'out_biz_no':trans_time.strftime('%Y%m%d%H%M%S'),
            },
            )




